package com.tbit.uqbike.client.dao.core;

import com.tbit.uqbike.client.pojo.InvoiceOrderBandMoney;
import com.tbit.uqbike.client.pojo.InvoiceRecord;
import com.tbit.uqbike.client.pojo.dto.ReOpenEditInvoiceRecordDTO;
import com.tbit.uqbike.client.pojo.vo.InvoiceCardLogVO;
import com.tbit.uqbike.client.pojo.vo.InvoiceRideLogVO;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * 发票开具记录
 *
 * @Author:BUGTian
 * @DATE: 2023/8/29
 */
public interface InvoiceRecordDao {

    /**
     * 查询开票信息（骑行订单）
     *
     * @param userId    用户id
     * @param startTime 起始时间
     * @param endTime   终止时间
     * @param minMoney  最低价(单位：分)
     * @param maxMoney  最高价(单位：分)
     * @param orderList 订单列表
     * @param invoiceId 开票记录主键
     * @return
     */
    List<InvoiceRideLogVO> queryInvoiceRideLog(@Param("userId") Integer userId, @Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("minMoney") Long minMoney, @Param("maxMoney") Long maxMoney, @Param("orderList") List<String> orderList, @Param("invoiceId") Integer invoiceId);

    /**
     * 查询开票信息（套餐订单）
     *
     * @param userId       用户id
     * @param startTime    起始时间
     * @param endTime      终止时间
     * @param minMoney     最低价(单位：分)
     * @param maxMoney     最高价(单位：分)
     * @param rechargeType 订单类型（1:免押卡 2:骑行卡 4:会员卡 5:优惠券套餐）
     * @param orderList    订单列表
     * @param invoiceId    开票记录主键
     * @return
     */
    List<InvoiceCardLogVO> queryInvoiceCardLog(@Param("userId") Integer userId, @Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("minMoney") Long minMoney, @Param("maxMoney") Long maxMoney, @Param("rechargeType") Integer rechargeType, @Param("orderList") List<String> orderList, @Param("invoiceId") Integer invoiceId);

    /**
     * 添加开票信息
     *
     * @param invoiceRecord
     * @return
     */
    Integer insertInvoiceRecord(InvoiceRecord invoiceRecord);

    /**
     * 添加绑定信息
     *
     * @param id        开票信息主键id
     * @param orderList 订单编号
     * @param status    订单状态
     */
    void insertInvoiceRecordBound(@Param("id") Integer id, @Param("orderList") List<InvoiceOrderBandMoney> orderList, @Param("status") Integer status);

    /**
     * 查询开票历史
     *
     * @param userId
     * @return
     */
    List<InvoiceRecord> queryInvoiceRecord(@Param("userId") Integer userId);

    /**
     * 删除开票绑定记录
     *
     * @param id
     */
    void deleteInvoiceRecordBound(@Param("id") Integer id);

    /**
     * 申请重开
     *
     * @param id     开票历史id
     * @param status 状态
     * @param time   时间
     */
    void updateInvoiceRecord(@Param("id") Integer id, @Param("status") Integer status, @Param("time") Date time, @Param("refundTime") Date refundTime);

    /**
     * 申请重开（修改信息）
     *
     * @param reOpenEditInvoiceRecordDTO
     */
    void reOpenEditInvoiceRecord(ReOpenEditInvoiceRecordDTO reOpenEditInvoiceRecordDTO);

    /**
     * 根据id查询发票历史
     *
     * @param id
     * @return
     */
    InvoiceRecord queryInvoiceRecordById(@Param("id") Integer id);

    /**
     * 更新发票绑定记录
     *
     * @param id
     * @param status
     */
    void updateInvoiceRecordBound(@Param("id") Integer id, @Param("status") Integer status);

    /**
     * 查询已绑定订单
     *
     * @param id
     * @return
     */
    List<InvoiceOrderBandMoney> selectBandOrder(@Param("id") Integer id);

    /**
     * 更新重开后待审核的下一笔发票id
     *
     * @param id
     * @param newId
     */
    void updateNewId(@Param("id") Integer id, @Param("newId") Integer newId);

    /**
     * 修改邮箱
     *
     * @param id
     * @param email
     */
    void updateEmail(@Param("id") Integer id, @Param("email") String email);

    /**
     * @description: 根据发票申请编号获取发票信息
     * @author: mo.shanyong
     * @date: 2025/4/3 19:55
     * @param: flowId 发票编号
     * @return: com.tbit.uqbike.client.pojo.InvoiceRecord
     */
    InvoiceRecord getByFlowId(@Param("flowId") String flowId);
    /**
     * @description: 根据发票申请编号更新发票状态
     * @author: mo.shanyong
     * @date: 2025/4/3 20:11
     * @param: flowId 发票申请编号
     * @param: status 状态
     * @return: int
     */
    int updateByFlowId(@Param("flowId") String flowId, @Param("status") Integer status);

    /**
     * @description: 根据id(优先)或flowId更新非空发票信息
     * @author: mo.shanyong
     * @date: 2025/4/3 20:20
     * @param: invoiceRecord
     * @return: int
     */
    int updateCheckNull(InvoiceRecord invoiceRecord);


}
